package com.wangdong.yating.okhttp3;

import android.os.Bundle;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Toast;

import java.io.File;
import java.io.IOException;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

public class PostActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_post);
    }

    /** 点击post 请求*/
    public void OkhttpPost(View view) {
//        okHttpPost();
        okhPostJsonString();
    }

    /** 执行post请求 参数 键值对*/
    private void okHttpPost() {
        /** n1.首先 还是需要创建OkHttpClient */
        OkHttpClient okHttpClient = new OkHttpClient();
        /** n2.添加post 请求的参数 构建FormBody，传入参数*/
        FormBody formBody = new FormBody.Builder()
                .add("username","admin")
                .add("password","admin")
                .build();
        /** n3.创建 请求 Request  FormBody作为Post放的参数传入*/
        final Request request =new Request.Builder()
                .url("http://www.jianshu.cmy")
                .post(formBody)
                .build();
        /**  n4.创建 呼叫 访问 Call */
        Call call = okHttpClient.newCall(request);
        /** 调用请求，重写回调方法*/
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {

            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {

            }
        });
    }

    /** post 请求 String 字符串 或是  json数据*/
    public void okhPostJsonString(){

        OkHttpClient okHttpClient = new OkHttpClient();
        /**上面我们的post的参数是通过构造一个FormBody通过键值对的方式来添加进去的,
         * 其实post方法需要传入的是一个RequestBody对象,FormBody是RequestBody的子类,
         * 但有时候我们常常会遇到要传入一个字符串的需求,比如客户端给服务器发送一个json字符串,
         * 那这种时候就需要用到另一种方式来构造一个RequestBody如下所示:

         上面的MediaType我们指定传输的是纯文本,而且编码方式是utf-8,通过上面的方式我们就可以向服务端发送json字符串啦。 */
        RequestBody requestBody = RequestBody
                .create(MediaType.parse("text/plain;charset=utf-8"),
                        "{username:admin;password:admin}");

        final Request request =new Request.Builder()
                .url("http://www.jianshu.cmy")
                .post(requestBody)
                .build();

        Call call = okHttpClient.newCall(request);

        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {

            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {

            }
        });
    }

    /** post 请求 上传 File 文件*/
    public void okPostFile(){

        OkHttpClient okHttpClient = new OkHttpClient();
        File file = new File(Environment.getExternalStorageDirectory(), "1.png");
        if (!file.exists()){
            Toast.makeText(this, "文件不存在", Toast.LENGTH_SHORT).show();
        }else{
            /*这里我们将手机SD卡根目录下的1.png图片进行上传。
             * 代码中的application/octet-stream表示我们的文件是任意二进制数据流,
             *          当然你也可以换成更具体的image/png*/
            RequestBody requestBody2 = RequestBody
                    .create(MediaType.parse("application/octet-stream"), file);

            /*注:最后记得最重要的一点:添加存储卡写权限,在AndroidManifest.xml文件中添加如下代码:
             <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>*/

            final Request request =new Request.Builder()
                    .url("http://www.jianshu.cmy")
                    .post(requestBody2)
                    .build();

            Call call = okHttpClient.newCall(request);

            call.enqueue(new Callback() {
                @Override
                public void onFailure(Call call, IOException e) {

                }

                @Override
                public void onResponse(Call call, Response response) throws IOException {

                }
            });
        }
    }
    /**post 请求提交 上传文件 */


    /** OkHttp进行Post请求提交表单
     *      我们在网页上经常会遇到用户注册的情况,需要你输入用户名,密码,还有上传头像,这其实就是一个表单,
     *      那么接下来我们看看如何利用OkHttp来进行表单提交。经过上面的学习,大家肯定也懂,主要的区别就在
     *      于构造不同的RequestBody传递给post方法即可.
     *
     *
     *      这里我们会用到一个MuiltipartBody,这是RequestBody的一个子类,我们提交表单就是利用这个类来构建
     *      一个RequestBody,下面的代码我们会发送一个包含用户民、密码、头像的表单到服务端
     *
     *      MuiltiparBady 需要 导入一个包okio.jar才能继续下面的内容,我们需要在模块的Gradle文件中添加如下代码,然后同步一下项目即可

            compile 'com.squareup.okio:okio:1.11.0' 但是有时候导入 okhttp 就好
     * */
    public void okhPostBaoDan(){

        OkHttpClient okHttpClient = new OkHttpClient();

        File file = new File(Environment.getExternalStorageDirectory(), "1.png");
        if (!file.exists()){
            Toast.makeText(this, "文件不存在", Toast.LENGTH_SHORT).show();
            return;
        }
        RequestBody muiltipartBody = new MultipartBody.Builder()
                //一定要设置这句
                .setType(MultipartBody.FORM)/*如果提交的是表单,一定要设置setType(MultipartBody.FORM)这一句*/
                .addFormDataPart("username", "admin")//
                .addFormDataPart("password", "admin")//
                .addFormDataPart("myfile", "1.png", RequestBody.create(MediaType.parse("application/octet-stream"), file))
                .build();
        final Request request =new Request.Builder()
                .url("http://www.jianshu.cmy")
                .post( muiltipartBody )
                .build();
        Call call = okHttpClient.newCall(request);

        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {

            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {

            }
        });
    }



    /** 点击下一页 文件上传*/
    public void okhttpnextfile(View view) {

    }
}
